// package com.zzht.patrol.bp.calculate.utils;
//
// import com.alibaba.fastjson.JSONArray;
// import com.alibaba.fastjson.JSONObject;
// import com.github.davidmoten.rtree.geometry.Geometries;
// import com.vividsolutions.jts.geom.*;
// import com.zzht.patrol.bp.calculate.model.task.PatrolTaskSubLine;
// import com.zzht.patrol.database.geometry.Path;
// import com.zzht.patrol.database.geometry.Point;
// import com.zzht.patrol.common.utils.CoordinateConversionUtil;
// import lombok.extern.log4j.Log4j2;
// import org.locationtech.jts.geom.Coordinate;
// import org.locationtech.jts.geom.LinearRing;
// import org.locationtech.jts.geom.Polygon;
//
// import java.util.ArrayList;
// import java.util.List;
//
// /**
//  * @author xiongweitao
//  * @version V1.0 Created on 2021/6/15
//  * @title JtsUtils
//  * @Description:
//  */
// @Log4j2
// public class JtsUtils {
//
//     private static final GeometryFactory GEOMETRY_FACTORY = new GeometryFactory();
//
//     /**
//      * 转成成jts对象
//      *
//      * @param line
//      * @param sr
//      * @return
//      */
//     public static MultiPolygon convertJsonToMultiRingString(JSONObject line, int sr) {
//         Polygon[] polygons = null;
//         JSONArray rings = line.getJSONArray("rings");
//         int len = rings.size();
//         polygons = new Polygon[len];
//         int i = 0;
//         for (int k = 0; k < len; k++) {
//             JSONArray path = rings.getJSONArray(k);
//             int count = path.size();
//             Coordinate[] coords = new Coordinate[count];
//             int j = 0;
//             for (int kk = 0; kk < count; kk++) {
//                 JSONArray point = path.getJSONArray(kk);
//                 double x = point.getDouble(0);
//                 double y = point.getDouble(1);
//                 Coordinate coord = new Coordinate(x, y);
//                 coords[j++] = coord;
//             }
//             LinearRing ringString = GEOMETRY_FACTORY
//                     .createLinearRing(coords);
//             ringString.setSRID(sr);
//             polygons[i++] = GEOMETRY_FACTORY.createPolygon(ringString);
//         }
//         MultiPolygon polygon = GEOMETRY_FACTORY.createMultiPolygon(polygons);
//         polygon.setSRID(sr);
//         return polygon;
//     }
//
//     /**
//      * 将任务线段转成几何
//      *
//      * @param taskLine 任务线段
//      * @return Path
//      */
//     public static Path taskLineToGeoPath(PatrolTaskSubLine taskLine) {
//         if (null == taskLine) {
//             return null;
//         }
//         Path path = new Path();
//         List<Point> pointList = new ArrayList<>(3);
//         pointList.add(new Point(taskLine.getStartX(), taskLine.getStartY()));
//         pointList.add(new Point(taskLine.getEndX(), taskLine.getEndY()));
//         path.setPointArray(pointList);
//         return path;
//     }
//
//     /**
//      * 平面坐标转经纬度
//      *
//      * @param point
//      */
//     public static void XYZToLonLat(Point point) {
//         try {
//             double x = point.getX();//x
//             double y = point.getY();//y
//             double[] xyz = new double[]{x, y, 0};
//             double[] lonLat = CoordinateConversionUtil.Mercator2lonLat(xyz);
//             point.setX(lonLat[0]);
//             point.setY(lonLat[1]);
//         } catch (Exception e) {
//             log.error("XYZToLonLat", e);
//         }
//     }
//
//     /**
//      * 经纬度转平面坐标
//      *
//      * @param point
//      */
//     public static void lonLatToXYZ(Point point) {
//         try {
//             double lon = point.getX();//经度
//             double lat = point.getY();//纬度
//             double[] lonLat = new double[]{lon, lat, 0};
//             double[] xyz = CoordinateConversionUtil.lonLat2Mercator(lonLat);
//             point.setX(xyz[0]);
//             point.setY(xyz[1]);
//         } catch (Exception e) {
//             log.error("lonLatToXYZ", e);
//         }
//     }
//
//
//     public static List<com.vividsolutions.jts.geom.Point> pointChageToJtsPoint(List<Point> points, boolean isChange) {
//         List<com.vividsolutions.jts.geom.Point> jtsPoints = new ArrayList<>();
//         for (Point p : points) {
// //            if (isChange) {
// //                lonLatToXYZ(p);
// //            }
//             com.vividsolutions.jts.geom.Point jtsp = createPoint(p.getX(), p.getY());
//             jtsPoints.add(jtsp);
//         }
//         return jtsPoints;
//     }
//
//     public static com.vividsolutions.jts.geom.Point createPoint(double x, double y) {
//         GeometryFactory factory = new GeometryFactory();
//         Coordinate coordinate = new Coordinate(x, y);
//         return factory.createPoint(coordinate);
//     }
//
//     /**
//      * 判断点是否在多边形内
//      *
//      * @param polygonPoints 多边形点集合
//      * @param x             横坐标/经度
//      * @param y             纵坐标/纬度
//      * @return 是否包含
//      */
//     public static boolean polygonIncludePoint(List<com.vividsolutions.jts.geom.Point> polygonPoints, double x, double y) {
//         Polygon polygon = createPolygon(polygonPoints);
//         com.vividsolutions.jts.geom.Point point = createPoint(x, y);
//         return polygon.contains(point);
//     }
//
//     /**
//      * 构造多边形
//      *
//      * @param points 点集合
//      */
//     public static Polygon createPolygon(List<com.vividsolutions.jts.geom.Point> points) {
//         GeometryFactory factory = new GeometryFactory();
//         Coordinate[] coordinates = buildCoordinates(points);
//         return factory.createPolygon(coordinates);
//     }
//
//     private static Coordinate[] buildCoordinates(List<com.vividsolutions.jts.geom.Point> points) {
//         List<Coordinate> coors = new ArrayList<>();
//         for (com.vividsolutions.jts.geom.Point point : points) {
//             Coordinate coor = new Coordinate(point.getX(), point.getY());
//             coors.add(coor);
//         }
//         return coors.toArray(new Coordinate[0]);
//     }
//
//     /**
//      * create a Circle  创建一个圆，圆心(x,y) 半径RADIUS
//      *
//      * @param x
//      * @param y
//      * @param RADIUS
//      * @return
//      */
//     public static Polygon createCircle(double x, double y, final double RADIUS) {
//         final int SIDES = 32;//圆上面的点个数
//         Coordinate coords[] = new Coordinate[SIDES + 1];
//         for (int i = 0; i < SIDES; i++) {
//             double angle = ((double) i / (double) SIDES) * Math.PI * 2.0;
//             double dx = Math.cos(angle) * RADIUS;
//             double dy = Math.sin(angle) * RADIUS;
//             coords[i] = new Coordinate((double) x + dx, (double) y + dy);
//         }
//         coords[SIDES] = coords[0];
//         LinearRing ring = GEOMETRY_FACTORY.createLinearRing(coords);
//         return GEOMETRY_FACTORY.createPolygon(ring, null);
//     }
//
//     public static Double metreLatAndLon(Double length) {
//         return length / 30.887 * 1 / 60 / 60;
//     }
//
// }
